﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using grupo2DEWStudio7i.Persistencia;
using grupo2DEWStudio7i.Persistencia.ADO;
using grupo2DEWStudio7i.Dominio;
using grupo2DEWStudio7i.Negocio;

using Spring.Context;
using Spring.Context.Support;

namespace grupo2DEWStudio7i.Pruebas
{
    [TestFixture]
    public class TestAdministracionServiceImpl
    {
        // Atributos a utilizar durante las pruebas
        //private IAdministracionService administracionService = null;
        IApplicationContext Spring = null;
        IAdministracionService Service = null;
        Local localCreado = null;
        Sala salaInscrita = null;
        Instrumento instrumentocreado = null;
        Cliente clienteregistrado = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // 1. Definimos la implementación de la clase de negocio
            //administracionService = new AdministracionServiceImpl();

            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://grupo2DEWStudio7i/grupo2DEWStudio7i/capaPersistencia.xml",
                "assembly://grupo2DEWStudio7i/grupo2DEWStudio7i/capaNegocio.xml"
                );
            // Obtención de la referencia al objeto "administracionService"
            Service = (IAdministracionService)Spring.GetObject("administracionService");
            // Creación de un local de pruebas

            localCreado = ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Crear(
                new Local() { Nombre = "C41", Direccion = "Monterrico" });
            //instrumentocreado = ((IInstrumentoDAO)Spring.GetObject("instrumentoDAO_ADO")).Crear(
            //    new Instrumento() { CodInstrumento = 1, TipoInstru = "Guitarra", MarcaInstru = "Fender", ModeloInstru = "Squier", AñoFabricacion = 2009, Caracteristicas = "Color madera", CostoxHora = 10 });

        }
        /*[Test]
        public void Test1_BuscarSala()
        {
            // 1. Clase a probar: AdministracionServiceImpl
            Assert.IsNotNull(Service);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Sala> lSalas = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 4. Ejecutamos el método a probar
                lSalas = Service.ListarXBusquedaReserva("", null, null, "", "", null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(lSalas);
        }
        [Test]
        public void Test2_BuscarSala()
        {
            // 1. Clase a probar: AdministracionServiceImpl
            Assert.IsNotNull(Service);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Sala> lSalas = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 4. Ejecutamos el método a probar
                lSalas = Service.ListarXBusquedaReserva("", null, null, "", "", null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(lSalas);
        }
        [Test]
        public void Test3_BuscarSala()
        {
            // 1. Clase a probar: AdministracionServiceImpl
            Assert.IsNotNull(Service);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Sala> lSalas = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 4. Ejecutamos el método a probar
                lSalas = Service.ListarXBusquedaReserva("", null, null, "guitarra", "", null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(lSalas);
        }
        */

        [Test]
        public void Test1_InscribirSala_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, null, 15);
            });
        }
        [Test]
        public void Test2_InscribirSala_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, ".NET Students", 15);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(salaInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(salaInscrita.Codigo, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(salaInscrita.Nombre, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.Codigo, localCreado.Codigo);
            Assert.AreEqual(salaInscrita.Capacidad, 30);
            Assert.AreEqual(salaInscrita.Caracteristicas, ".NET Students");
        }
        [Test]
        public void Test3_InscribirSala_Repetida()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.Codigo, 30, ".NET Students", 15);
            });
        }


        [Test]
        public void Test4_RegistrarInstrumento_Ok()
        {
            // Probamos que no exista error en registrar el instrumento
            Assert.DoesNotThrow(delegate
            {
                instrumentocreado = Service.RegistrarInstumento("Bajo", "Squier", "Fender", 2009, "Color madera", 10);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(instrumentocreado);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(instrumentocreado.CodInstrumento, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(instrumentocreado.TipoInstru, "Bajo");
            Assert.AreEqual(instrumentocreado.MarcaInstru, "Fender");
            Assert.AreEqual(instrumentocreado.CostoxHora, 10);
            Assert.AreEqual(instrumentocreado.AñoFabricacion, 2009);
        }

        [Test]
        public void Test5_RegistrarInstrumento_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarInstumento("Guitarra", "Fender", null, 2009, "Color madera", 10);
            });
        }

        [Test]
        public void Test6_RegistrarInstrumento_Repetida()
        {
            // Probamos que se lance la excepción de instrumento repetido
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarInstumento("Bajo", "Fender", "Squier", 2009, "Color madera", 10);
            });
        }

        //-Galvez


        [Test]
        public void Test7_RegistrarCliente_Ok()
        {
            // Probamos que no exista error en la inscripción del cliente
            Assert.DoesNotThrow(delegate
            {
                clienteregistrado = Service.RegistrarCliente("juanwww", "12345678", "123456", "lukas@hotmail.com", "07/09/2007");
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(clienteregistrado);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(clienteregistrado.Codigo, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(clienteregistrado.Nombre, "juanwww");
            Assert.AreEqual(clienteregistrado.Dni, "12345678");
            Assert.AreEqual(clienteregistrado.Clave, "123456");
            Assert.AreEqual(clienteregistrado.Correo, "lukas@hotmail.com");
            Assert.AreEqual(clienteregistrado.FecNac, "07/09/2007");
        }

        [Test]
        public void Test8_RegistrarCliente_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {

                Service.RegistrarCliente("wsLukas", null, "123456", "lukas@hotmail.com", "07/09/2007");

            });
        }

        [Test]
        public void Test9_RegistrarCliente_Repetida()
        {
            // Probamos que se lance la excepción de cliente repetido
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarCliente("Lukas", "45129894", "123456", "lukas@hotmail.com", "07/09/2007");
            });
        }


        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            // Eliminamos la sala inscrita
            ((ISalaDAO)Spring.GetObject("salaDAO_ADO")).Eliminar(salaInscrita);
            // Eliminamos el local de prueba creado inicialmente
            ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Eliminar(localCreado);
            // Eliminamos el local de prueba creado inicialmente
            ((IInstrumentoDAO)Spring.GetObject("instrumentoDAO_ADO")).Eliminar(instrumentocreado);
            // Eliminamos el cliente de prueba creado inicialmente
            ((IClienteDAO)Spring.GetObject("clienteDAO_ADO")).Eliminar(clienteregistrado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }
    }
}